#pragma once

#include <QFrame>
#include <QList>
#include <QPoint>
#include <QSize>
#include <QTimer>

class DockTab;
class DockingTabStack;

/**
 * DockingTabWell - 标签页容器
 * 管理多个DockTab的水平重叠排列，支持拖拽重排序和预览
 */
class DockingTabWell : public QFrame
{
    Q_OBJECT
    
public:
    explicit DockingTabWell(QWidget* parent = nullptr);
    explicit DockingTabWell(DockingTabStack* parentStack, QWidget* parent = nullptr);
    ~DockingTabWell();
    
    // === 标签页管理 ===
    void addTab(DockTab* tab, int index = -1, bool keepInactive = false);
    void removeTab(DockTab* tab);
    void removeTab(int index);
    void clear();
    
    // === 激活状态管理 ===
    void bringTabToFront(int index);
    void bringTabToFront(DockTab* tab);
    DockTab* foregroundTab() const;
    int foregroundTabIndex() const;
    
    // === 标签页查询 ===
    int tabCount() const { return m_tabs.size(); }
    QList<DockTab*> tabs() const { return m_tabs; }
    DockTab* tabAt(int index) const;
    int getTabIndex(DockTab* tab) const;
    
    // === 拖拽支持 (供DockTab调用) ===
    int calculateDropIndexForPosition(const QPoint& position, DockTab* draggedTab);
    QPoint getTabPositionForIndex(int index) const;
    bool hasSpaceForNewTab() const;
    
    // === 布局参数 ===
    int overlapWidth() const { return OVERLAP_WIDTH; }
    QSize computeTabSize() const;
    QSize computeAdaptiveTabSize(int tabIndex) const; // 计算指定标签的自适应大小
    QSize maximumTabSize() const { return m_maxTabSize; }
    void setMaximumTabSize(const QSize& size);
    
    // === 拖拽状态管理 ===
    bool isDragInProgress() const { return m_draggedTab != nullptr; }
    DockTab* draggedTab() const { return m_draggedTab; }
    void setDraggedTab(DockTab* tab);
    void clearDraggedTab();
    
    // === 主标签管理 ===
    DockTab* mainTab() const; // 获取主标签（无论在什么位置）
    int mainTabIndex() const; // 获取主标签的索引
    bool hasMainTab() const; // 是否有主标签
    void setMainTab(DockTab* tab); // 设置某个标签为主标签

signals:
    void tabAdded(DockTab* tab, int index);
    void tabRemoved(DockTab* tab, int index);
    void tabActivated(DockTab* tab, int index);
    void tabMoved(DockTab* tab, int fromIndex, int toIndex);
    void tabCloseRequested(DockTab* tab);
    
    // 拖拽相关信号
    void tabDragStarted(DockTab* tab);
    void tabDragPreview(int fromIndex, int toIndex);
    void tabDragFinished(DockTab* tab, bool accepted);
    void tabPullOutRequested(DockTab* tab, const QPoint& globalPos);

protected:
    // === Qt事件重写 ===
    void paintEvent(QPaintEvent* event) override;
    void resizeEvent(QResizeEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;
    void contextMenuEvent(QContextMenuEvent* event) override;
    
    // === 拖放支持 ===
    void dragEnterEvent(QDragEnterEvent* event) override;
    void dragMoveEvent(QDragMoveEvent* event) override;
    void dragLeaveEvent(QDragLeaveEvent* event) override;
    void dropEvent(QDropEvent* event) override;
    
    // === 尺寸提示 ===
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;

private slots:
    // === DockTab事件处理 ===
    void onTabActivated();
    void onTabCloseRequested();
    void onTabDragStarted();
    void onTabDragPositionChanged(const QPoint& globalPos);
    void onTabDragFinished();
    void onTabHorizontalDragPreview(int fromIndex, int toIndex);
    void onTabHorizontalDragCommit(int fromIndex, int toIndex);
    void onTabPullOutWindowRequested(const QPoint& globalPos, QWidget* content);
    void onTabReturnToWell();

private:
    // === 布局管理 ===
    void arrangeChildren();
    void updateTabPositions();
    QRect calculateTabGeometry(int index, bool isDragged = false) const;
    QRect calculateAdaptiveTabGeometry(int index) const; // 计算自适应大小的标签几何形状
    int calculateTotalWidth() const;
    
    // === 拖拽辅助 ===
    void showDropIndicator(int index);
    void hideDropIndicator();
    void updateDragPreview();
    
    // === 绘制辅助 ===
    void paintBackground(QPainter& painter);
    void paintDropIndicator(QPainter& painter);
    void paintTabSeparators(QPainter& painter);
    
    // === 标签页连接管理 ===
    void connectTabSignals(DockTab* tab);
    void disconnectTabSignals(DockTab* tab);
    
    // === 工具函数 ===
    void setupTabWell();
    DockTab* findTabAt(const QPoint& pos) const;
    void ensureValidForegroundTab();
    void updateTabStyles();
    
    // === 右键菜单 ===
    void showContextMenu(const QPoint& pos, DockTab* clickedTab = nullptr);

private:
    DockingTabStack* m_parentStack;
    QList<DockTab*> m_tabs;
    int m_foregroundIndex;
    
    // === 布局参数 ===
    QSize m_maxTabSize;
    bool m_needsLayout;
    
    // === 拖拽状态 ===
    DockTab* m_draggedTab;          // 当前被拖拽的标签
    int m_dropIndicatorIndex;       // 放置指示器位置 (-1表示隐藏)
    QPoint m_lastDragPosition;      // 最后的拖拽位置
    
    // === 预览状态 ===
    int m_previewFromIndex;         // 预览：原始位置
    int m_previewToIndex;           // 预览：目标位置
    bool m_showPreview;             // 是否显示预览
    
    // === 外观配置 ===
    static const int OVERLAP_WIDTH = 0;        // 标签重叠宽度（为0，标签紧挨）
    static const int TAB_SPACING = 0;          // 标签间距（为0）
    static const int MIN_TAB_WIDTH = 48;       // 最小标签宽度（VSCode风格）
    static const int MAX_TAB_WIDTH = 140;      // 最大标签宽度（VSCode风格）
    static const int TAB_HEIGHT = 30;          // 标签高度
    static const int DROP_INDICATOR_WIDTH = 3; // 放置指示器宽度
};

